如標題,這篇想用「圖解
」去解釋河內塔的「程式遞迴執行順序」為何
因為當初C有一項作業,叫我們用程式去寫出河內塔的執行結果
但我實在是不會寫,於是去網路上查,雖然是查到該怎麼撰寫了,但它的遞迴執行順序實在是很不直覺,單用想的會想破頭
最後我是用小畫家一個一個畫出順序才想通它,所以想和各位分享一下
首先,要先說說河內塔是什麼
有三個半徑不一樣的環,「由大到小」依序往上堆疊,你要將A柱子
的三個環移動到C柱子
,且大環不能疊在小環上
它的初始樣子如下圖所示:
現在你要用程式將它們的執行次數和順序依序列印出來,n值
代表有幾個環:
void example_1(int n, char A, char B, char C) {
if(n==1) {
printf("盤子從%c移到%c\n", A, C);
} else {
example_1(n-1, A, C, B);
printf("盤子從%c移到%c\n", A, C);
example_1(n-1, B, A, C);
}
}
int main() {
int n;
printf("請輸入n:");
scanf("%d", &n);
example_1(n, 'A', 'B', 'C');
return 0;
}
結果如下圖所示:
它的執行順序如果畫樹狀圖是長這樣,「最前面的數字」是n值
,「剩下的」分別為example_1
這個函數所接收到的char A, Char B, Char C
的順序
「藍色字」是它會進if
還是else
,「綠色字」是它的印出順序
和結果
那為什麼順序2、4、6
會分別寫在那呢?因為你執行完第一個example_1
函數,會跳回「原本的else
」繼續執行,而下一個執行的是printf
,最後才是第二個example_1
函數
else {
example_1(n-1, A, C, B);
printf("盤子從%c移到%c\n", A, C);
example_1(n-1, B, A, C);
}
所以它的整體執行順序如下圖所示:
那我們現在來看它「實際移動」的圖,看它是如何從柱子A
移到柱子C
的:
順序1:
順序2:
順序3:
順序4:
順序5:
順序6:
順序7:
這樣就移動成功囉!總共移動的次數為7次
以上就是今天的介紹
希望大家看完能對河內塔的程式遞迴執行順序更加了解!
參考資料:
https://lakesd6531.pixnet.net/blog/post/332283123